home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_10 / allison / arglist2.cpp < prev    next >
C/C++ Source or Header  |  1994-09-06  |  1KB  |  53 lines

  1. LISTING 16
  2. #include <fstream.h>
  3. #include <cstring.h>
  4. #include "arglist2.h"
  5.  
  6. Arglist::Arglist(size_t arg_count, char **arg_vec)
  7. {
  8.     args = new string[arg_count];
  9.     available = arg_count;
  10.     used = 0;
  11.     // INVARIANT: available+used == amount allocated
  12.  
  13.     for (int i = 0; i < arg_count; ++i)
  14.         if (arg_vec[i][0] == '@')
  15.             expand(arg_vec[i]+1);
  16.         else
  17.             add(arg_vec[i]);
  18. }
  19.  
  20. Arglist::~Arglist()
  21. {
  22.     delete [] args;
  23. }
  24.  
  25. void Arglist::expand(char *fname)
  26. {
  27.     ifstream f(fname);
  28.     const size_t BUFSIZ = 64;
  29.     char token[BUFSIZ];
  30.  
  31.     while (f >> token)
  32.         if (token[0] == '@')
  33.             expand(token+1);
  34.         else
  35.             add(token);
  36. }
  37.  
  38. void Arglist::add(char *arg)
  39. {
  40.     if (!available)
  41.     {
  42.         /* Grow argument list */
  43.         string *new_args = new string[used + CHUNK];
  44.         for (int i = 0; i < used; ++i)
  45.             new_args[i] = args[i];
  46.         args = new_args;
  47.         available = CHUNK;
  48.     }
  49.     args[used++] = arg;
  50.     --available;
  51. }
  52.  
  53.